<?php declare(strict_types=1);
/**
 * @author      xianganyall <xianganyall@gmail.com>
 * @copyright   2023-2025 owner
 **/

namespace Srv\Libs\Common;

final class CommValid
{
    /**
     * @return bool
     * 是否是CLI模式
     */
    public static function isCli():bool
    {
        return strtolower(defined('PHP_SAPI') ? PHP_SAPI : (function_exists('php_sapi_name') ? php_sapi_name() : '')) === 'cli';
    }

    /**
     * @return bool
     * 是否是WIN系统
     */
    public static function isWin():bool
    {
        $runOs  = defined('PHP_OS') ? PHP_OS : (function_exists('php_uname') ? php_uname('s') : '');
        return (strlen($runOs) >= 3 && strtolower(substr($runOs, 0, 3)) === 'win');
    }

    /**
     * @param string $host
     * @return bool
     * 是否是UNIX协议
     */
    public static function isUnix(string $host):bool
    {
        return strtolower(substr($host, 0, 6)) === 'unix:/';
    }

    /**
     * @param string $protocol
     * @return bool
     * 是否是Phar协议
     */
    public static function isPhar(string $protocol):bool
    {
        return strtolower(substr($protocol, 0, 7)) === 'phar://';
    }

    /**
     * @param string $ipStr
     * @return bool
     * 是否是IP地址
     */
    public static function isIp(string $ipStr):bool
    {
        return preg_match("/^\b(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\b$/", $ipStr) > 0;
    }

    /**
     * @param string $ipv6Str
     * @return bool
     * 是否是IPv6
     */
    public static function isIpv6(string $ipv6Str):bool
    {
        return preg_match('/^\s*((([\dA-Fa-f]{1,4}:){7}([\dA-Fa-f]{1,4}|:))|(([\dA-Fa-f]{1,4}:){6}(:[\dA-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([\dA-Fa-f]{1,4}:){5}(((:[\dA-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([\dA-Fa-f]{1,4}:){4}(((:[\dA-Fa-f]{1,4}){1,3})|((:[\dA-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([\dA-Fa-f]{1,4}:){3}(((:[\dA-Fa-f]{1,4}){1,4})|((:[\dA-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([\dA-Fa-f]{1,4}:){2}(((:[\dA-Fa-f]{1,4}){1,5})|((:[\dA-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([\dA-Fa-f]{1,4}:)(((:[\dA-Fa-f]{1,4}){1,6})|((:[\dA-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[\dA-Fa-f]{1,4}){1,7})|((:[\dA-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/', $ipv6Str) > 0;
    }

    /**
     * @param string $ipv6Str
     * @return bool
     * 是否是完整IPv6
     */
    public static function isIpv6Fill(string $ipv6Str):bool
    {
        return preg_match('/^[\dA-Fa-f]{4}:[\dA-Fa-f]{4}:[\dA-Fa-f]{4}:[\dA-Fa-f]{4}:[\dA-Fa-f]{4}:[\dA-Fa-f]{4}:[\dA-Fa-f]{4}:[\dA-Fa-f]{4}$/', $ipv6Str) > 0;
    }

    /**
     * @param string $ipv6Str
     * @return bool
     * 是否是来自Ipv4的IPv6
     */
    public static function isIpv6FromIpv4(string $ipv6Str):bool
    {
        $ipv6FillStr    = CommNet::ipV6Fill($ipv6Str);
        return preg_match('/^0{4}:0{4}:0{4}:0{4}:0{4}:(f{4}|F{4}|0{4}):[\dA-Fa-f]{4}:[\dA-Fa-f]{4}$/', $ipv6FillStr) > 0 && preg_match('/^0{4}:0{4}:0{4}:0{4}:0{4}:0{4}:0{4}:[\dA-Fa-f]{4}$/', $ipv6FillStr) < 1;
    }

    /**
     * @param string $email
     * @return bool
     * 是否是Email
     */
    public static function isEmail(string $email):bool
    {
        $emailLength    = strlen($email);
        if($emailLength < 5 || $emailLength > 250) return false;
        return preg_match("/^\w+(?:(?:\.|-)\w+)*@\w+(?:(?:\.|-)\w+)*\.\w+$/", $email) > 0;
    }

    /**
     * @param string $address
     * @return bool
     * 是否是Web3
     */
    public static function isWeb3(string $address):bool
    {
        return preg_match("/^0x[\da-f]{40}$/i", $address) > 0;
    }

    /**
     * @param string $txIdHash
     * @return bool
     * 是否是Web3交易Hash
     */
    public static function isWeb3Hash(string $txIdHash):bool
    {
        return preg_match("/^0x[\da-f]{64}$/i", $txIdHash) > 0;
    }

    /**
     * @param string $httpUrl
     * @return bool
     * 是否是HTTP
     */
    public static function isHttp(string $httpUrl):bool
    {
        return preg_match("/^http:\/\/[\da-z-]+\.[\da-z]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"])*$/i", $httpUrl) > 0;
    }

    /**
     * @param string $httpUrl
     * @return bool
     * 是否是HTTPS
     */
    public static function isHttps(string $httpUrl):bool
    {
        return preg_match("/^https:\/\/[\da-z-]+\.[\da-z]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"])*$/i", $httpUrl) > 0;
    }

    /**
     * @param string $httpUrl
     * @return bool
     * 是否是自适应协议
     */
    public static function isProtocol(string $httpUrl):bool
    {
        return preg_match("/^\/\/[\da-z-]+\.[\da-z]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"])*$/i", $httpUrl) > 0;
    }

    /**
     * @param string $httpUrl
     * @return bool
     * 是否是全部WEB协议
     */
    public static function isAllWeb(string $httpUrl):bool
    {
        return self::isHttp($httpUrl) || self::isHttps($httpUrl) || self::isProtocol($httpUrl);
    }

    /**
     * @param string $string
     * @return bool
     * 是否是MD5
     */
    public static function isMd5(string $string):bool
    {
        return preg_match('/^[\da-f]{32}$/i', $string) > 0;
    }

    /**
     * @param string $string
     * @return bool
     * 是否是MD5小写
     */
    public static function isMd5Lower(string $string):bool
    {
        return preg_match('/^[\da-f]{32}$/', $string) > 0;
    }

    /**
     * @param string $string
     * @return bool
     * 是否是MD5大写
     */
    public static function isMd5Upper(string $string):bool
    {
        return preg_match('/^[\dA-F]{32}$/', $string) > 0;
    }

    /**
     * @param string $string
     * @return bool
     * 是否是SHA1
     */
    public static function isSha1(string $string):bool
    {
        return preg_match('/^[\da-f]{40}$/i', $string) > 0;
    }

    /**
     * @param string $string
     * @return bool
     * 是否是SHA1小写
     */
    public static function isSha1Lower(string $string):bool
    {
        return preg_match('/^[\da-f]{40}$/', $string) > 0;
    }

    /**
     * @param string $string
     * @return bool
     * 是否是SHA1大写
     */
    public static function isSha1Upper(string $string):bool
    {
        return preg_match('/^[\dA-F]{40}$/', $string) > 0;
    }

    /**
     * @param string $qqNum
     * @return bool
     * 是否是QQ
     */
    public static function isQq(string $qqNum):bool
    {
        return preg_match("/^[1-9]\d{5,13}$/", $qqNum) > 0;
    }

    /**
     * @param string $postCode
     * @return bool
     * 是否是邮编
     */
    public static function isPostCode(string $postCode):bool
    {
        return preg_match("/^[1-9]\d{5}$/", $postCode) > 0;
    }

    /**
     * @param string $idCard
     * @return bool
     * 是否是身份证
     */
    public static function isIdCard(string $idCard):bool
    {
        return preg_match("/^\d{15}(\d{2}[x\d])?$/i", $idCard) > 0;
    }

    /**
     * @param string $idCard
     * @return bool
     * 是否是正确的身份证
     */
    public static function isIdCardReal(string $idCard):bool
    {
        $idCardSize         = strlen($idCard);
        if($idCardSize === 18 && self::getIdCardVerify(substr($idCard, 0, 17)) === strtolower(substr($idCard, 17, 1))){
            // 进一步校验年月日
            $yearInt        = intval(substr($idCard, 6, 4));
            $monthInt       = intval(substr($idCard, 10, 2));
            $dayInt         = intval(substr($idCard, 12, 2));
            if($yearInt < 1000 || $yearInt > 3000 || $monthInt < 1 || $monthInt > 12 || $dayInt < 1 || $dayInt > 31) return false;
            return checkdate($monthInt, $dayInt, $yearInt);
        }
        return false;
    }

    /**
     * @param string $idCard
     * @return string
     * 获取身份证验证位
     */
    private static function getIdCardVerify(string $idCard):string
    {
        if(strlen($idCard) !== 17 || !is_numeric($idCard)) return '';
        $factor         = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
        $verifyList     = ['1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2'];
        $checkSum       = 0;
        $i              = -1;
        while(++$i < 17) $checkSum += substr($idCard, $i, 1) * $factor[$i];
        return $verifyList[$checkSum%11]??'';
    }

    /**
     * @param string $mobile
     * @return bool
     * 是否是手机号码
     */
    public static function isMobile(string $mobile):bool
    {
        return preg_match("/^((\(\d{3}\))|(\d{3}-))?((13)|(14)|(15)|(16)|(17)|(18)|(19))\d{9}$/", $mobile) > 0;
    }

    /**
     * @param string $phone
     * @return bool
     * 是否是电话号码
     */
    public static function isPhone(string $phone):bool
    {
        return preg_match("/^((\(\d{3}\))|(\d{3}-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/", $phone) > 0;
    }

    /**
     * @param string $english
     * @return bool
     * 是否是英文字符
     */
    public static function isEnglish(string $english):bool
    {
        return preg_match("/^[A-Za-z]+$/", $english) > 0;
    }

    /**
     * @param string $string
     * @return bool
     * 是否是数字字符
     */
    public static function isNumber(string $string):bool
    {
        return preg_match("/^\d+$/", $string) > 0;
    }

    /**
     * @param string $string
     * @return bool
     * 是否是英文和数字
     */
    public static function isEnglishAndNumber(string $string):bool
    {
        return preg_match("/^[\dA-Za-z]+$/", $string) > 0;
    }

    /**
     * @param string $string
     * @return bool
     * 是否是中文
     */
    public static function isChinese(string $string):bool
    {
        return preg_match('/[\x{4e00}-\x{9fa5}]+/u', $string) > 0;
    }

    /**
     * @param string $age
     * @return bool
     * 是否是合法年龄
     */
    public static function isAge(string $age):bool
    {
        return (preg_match("/^[1-9]\d{0,2}$/", $age) && intval($age) <= 180 && intval($age) >= 1);
    }

    /**
     * @param int $gender
     * @return bool
     * 是否是合法性别[0-默认,1-男,2-女]
     */
    public static function isGender(int $gender):bool
    {
        return in_array($gender, [0, 1, 2], true);
    }

    /**
     * @param string $mac
     * @return bool
     * 是否是MAC地址
     */
    public static function isMac(string $mac):bool
    {
        return preg_match('/^[a-fA-F\d]{2}:[a-fA-F\d]{2}:[a-fA-F\d]{2}:[a-fA-F\d]{2}:[a-fA-F\d]{2}:[a-fA-F\d]{2}$/', $mac) > 0;
    }

    /**
     * @param string $colorStr
     * @param bool $allowShort
     * @return bool
     * 是否是颜色十六进制
     */
    public static function isColor(string $colorStr, bool $allowShort = false):bool
    {
        $colorStrLength = strlen($colorStr);
        if($colorStrLength !== 6 && $colorStrLength !== 8 && $colorStrLength !== 3 && $colorStrLength !== 4) return false;
        if(preg_match('/^[a-f\d]{6}$/i', $colorStr) > 0 || preg_match('/^[a-f\d]{8}$/i', $colorStr) > 0) return true;
        if($allowShort && (preg_match('/^[a-f\d]{3}$/i', $colorStr) > 0 || preg_match('/^[a-f\d]{4}$/i', $colorStr) > 0)) return true;
        return false;
    }

    /**
     * @param string $colorStr
     * @param bool $allowShort
     * @return bool
     * 是否是颜色十六进制-不含Alpha
     */
    public static function isColorNoAlpha(string $colorStr, bool $allowShort = false):bool
    {
        $colorStrLength = strlen($colorStr);
        if($colorStrLength !== 6 && $colorStrLength !== 3) return false;
        if(preg_match('/^[a-f\d]{6}$/i', $colorStr) > 0) return true;
        if($allowShort && preg_match('/^[a-f\d]{3}$/i', $colorStr) > 0) return true;
        return false;
    }

    /**
     * @param string $colorStr
     * @param bool $allowShort
     * @return bool
     * 是否是颜色十六进制-含有Alpha
     */
    public static function isColorAndAlpha(string $colorStr, bool $allowShort = false):bool
    {
        $colorStrLength = strlen($colorStr);
        if($colorStrLength !== 8 && $colorStrLength !== 4) return false;
        if(preg_match('/^[a-f\d]{8}$/i', $colorStr) > 0) return true;
        if($allowShort && preg_match('/^[a-f\d]{4}$/i', $colorStr) > 0) return true;
        return false;
    }

    /**
     * @param string $domain
     * @return bool
     * 是否是域名
     */
    public static function isDomain(string $domain):bool
    {
        return preg_match('/^[A-Za-z\d][A-Za-z\d-]+(\.[A-Za-z\d-]+){1,3}$/', $domain) > 0;
    }

    /**
     * @param string $cnDomain
     * @return bool
     * 是否是中国域名
     */
    public static function isCnDomain(string $cnDomain):bool
    {
        return preg_match('/^([-a-zA-Z\d.]*[\x{4e00}-\x{9fa5}]*[-a-zA-Z\d.]*)+\.(中国|公司|网络|CN|COM|NET)$/iu', $cnDomain) > 0;
    }

    /**
     * @param string $host
     * @return bool
     * 是否是主机名
     */
    public static function isHost(string $host):bool
    {
        return preg_match('/^\w[A-Za-z\d-]+(\.[A-Za-z\d-_]+)*$/', $host) > 0;
    }

    /**
     * @param string $cnHost
     * @return bool
     * 是否是中文主机名
     */
    public static function isCnHost(string $cnHost):bool
    {
        return preg_match('/^\w*([\x{4e00}-\x{9fa5}]*[-a-zA-Z\d.]*)+\w$/iu', $cnHost) > 0;
    }

    /**
     * @param string $dateTime
     * @return bool
     * 是否是日期时间(年月日时分秒)
     */
    public static function isDateTime(string $dateTime):bool
    {
        return preg_match('/^\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}:\d{1,2}$/', $dateTime) > 0;
    }

    /**
     * @param string $dateTimes
     * @return bool
     * 是否是严格格式的日期时间(年月日时分秒)
     */
    public static function isDateTimes(string $dateTimes):bool
    {
        return preg_match('/^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}$/', $dateTimes) > 0;
    }

    /**
     * @param string $date
     * @return bool
     * 是否是日期(年月日)
     */
    public static function isDate(string $date):bool
    {
        return preg_match('/^\d{4}-\d{1,2}-\d{1,2}$/', $date) > 0;
    }

    /**
     * @param string $dates
     * @return bool
     * 是否是严格格式的日期(年月日)
     */
    public static function isDates(string $dates):bool
    {
        return preg_match('/^\d{4}-\d{2}-\d{2}$/', $dates) > 0;
    }

    /**
     * @param string $time
     * @return bool
     * 是否是时间(时分秒)
     */
    public static function isTime(string $time):bool
    {
        return preg_match('/^\d{1,2}:\d{1,2}:\d{1,2}$/', $time) > 0;
    }

    /**
     * @param string $times
     * @return bool
     * 是否是严格格式的时间(时分秒)
     */
    public static function isTimes(string $times):bool
    {
        return preg_match('/^\d{2}:\d{2}:\d{2}$/', $times) > 0;
    }

    /**
     * @param string $uuId
     * @return bool
     * 是否是UUID格式[8-4-4-4-12]
     */
    public static function isUuIdFormat(string $uuId):bool
    {
        if(strlen($uuId) !== 36) return false;
        return preg_match('/^[A-Z\d]{8}-[A-Z\d]{4}-[A-Z\d]{4}-[A-Z\d]{4}-[A-Z\d]{12}$/i', $uuId) > 0;
    }

    /**
     * @param string $uuId
     * @return bool
     * 是否是UUID[8-4-4-4-12]
     */
    public static function isUuId(string $uuId):bool
    {
        if(strlen($uuId) !== 36) return false;
        return preg_match('/^[A-F\d]{8}-[A-F\d]{4}-[A-F\d]{4}-[A-F\d]{4}-[A-F\d]{12}$/i', $uuId) > 0;
    }

    /**
     * @param string $version
     * @return bool
     * 是否是版本字符串
     */
    public static function isVersion(string $version):bool
    {
        return preg_match('/^\d+\.\d+\.\d+$/', $version) > 0;
    }

    /**
     * @param string $version
     * @return bool
     * 是否是版本FULL字符串
     */
    public static function isVersionFull(string $version):bool
    {
        return preg_match('/^\d+\.\d+\.\d+.\d+$/', $version) > 0;
    }

    /**
     * @param string $lng
     * @param bool $isZeroStr
     * @return bool
     * 是否是位置经度
     */
    public static function isLocationLng(string $lng, bool $isZeroStr = false):bool
    {
        if($isZeroStr && self::isZeroStr($lng)) return true;
        if(!preg_match('/^-?\d{1,3}\.\d{1,18}$/', $lng)) return false;
        $lngFloat   = floatval($lng);
        return (-180 <= $lngFloat && $lngFloat <= 180);
    }

    /**
     * @param string $lat
     * @param bool $isZeroStr
     * @return bool
     * 是否是位置纬度
     */
    public static function isLocationLat(string $lat, bool $isZeroStr = false):bool
    {
        if($isZeroStr && self::isZeroStr($lat)) return true;
        if(!preg_match('/^-?\d{1,2}\.\d{1,18}$/', $lat)) return false;
        $latFloat   = floatval($lat);
        return (-90 <= $latFloat && $latFloat <= 90);
    }

    /**
     * @param string $lat
     * @param string $lng
     * @return bool
     * 是否是空位置经纬度
     */
    public static function isEmptyLatLng(string $lat, string $lng):bool
    {
        return self::isLocationLatEmpty($lat) || self::isLocationLngEmpty($lng);
    }

    /**
     * @param string $lng
     * @return bool
     * 是否是空位置经度
     */
    public static function isLocationLngEmpty(string $lng):bool
    {
        return strlen($lng) < 1 || self::isZeroStr($lng);
    }

    /**
     * @param string $lat
     * @return bool
     * 是否是空位置纬度
     */
    public static function isLocationLatEmpty(string $lat):bool
    {
        return strlen($lat) < 1 || self::isZeroStr($lat);
    }

    /**
     * @param string $str
     * @return bool
     * isZeroStr
     */
    public static function isZeroStr(string $str):bool
    {
        return self::isZeroIntStr($str) || self::isZeroFloatStr($str);
    }

    /**
     * @param string $str
     * @return bool
     * isZeroIntStr
     */
    public static function isZeroIntStr(string $str):bool
    {
        return preg_match('/^[+-]?0+$/', $str) > 0;
    }

    /**
     * @param string $str
     * @return bool
     * isZeroFloatStr
     */
    public static function isZeroFloatStr(string $str):bool
    {
        return preg_match('/^[+-]?0+\.0+$/', $str) > 0;
    }

    /**
     * @param string $appleId
     * @return bool
     * 是否是苹果ID[IDFA/IDFV]
     */
    public static function isAppleId(string $appleId):bool
    {
        return self::isUuId($appleId);
    }

    /**
     * @param string $imei
     * @return bool
     * 是否是安卓IMEI
     */
    public static function isAndroidImei(string $imei):bool
    {
        $imeiLength     = strlen($imei);
        if($imeiLength < 12 || $imeiLength > 20) return false;
        return preg_match('/^[a-f\d]{12,20}$/i', $imei) > 0;
    }

    /**
     * @param string $sn
     * @return bool
     * 是否是安卓SN
     */
    public static function isAndroidSn(string $sn):bool
    {
        $snLength       = strlen($sn);
        if($snLength < 12 || $snLength > 64) return false;
        return preg_match('/^[a-z\d_=\-+|]{12,64}$/i', $sn) > 0;
    }

    /**
     * @param string $oaId
     * @return bool
     * 是否是安卓OAID
     */
    public static function isAndroidOaId(string $oaId):bool
    {
        $oaIdLength     = strlen($oaId);
        if($oaIdLength < 12 || $oaIdLength > 64) return false;
        return preg_match('/^[a-z\d_=\-+|]{12,64}$/i', $oaId) > 0;
    }

    /**
     * @param string $gaId
     * @return bool
     * 是否是安卓GAID
     */
    public static function isAndroidGaId(string $gaId):bool
    {
        $gaIdLength     = strlen($gaId);
        if($gaIdLength < 12 || $gaIdLength > 64) return false;
        return preg_match('/^[a-z\d_=\-+|]{12,64}$/i', $gaId) > 0;
    }

    /**
     * @param string $string
     * @param int    $min
     * @param int    $max
     * @return bool
     * 是否是常规字符串
     */
    public static function isString(string $string, int $min = 6, int $max = 32):bool
    {
        return (preg_match("/^\w+$/", $string) && strlen($string) <= $max && strlen($string) >= $min);
    }

    /**
     * @param string $fileName
     * @return string
     * 过滤文件名字符出
     */
    public static function filterName(string $fileName):string
    {
        return trim(preg_replace_callback(["'\\\\'", "'/'", "':'", "'\*'", "'\?'", "'\"'", "'<'", "'>'", "'\|'", "' '"], function(){return '';}, $fileName));
    }

    /**
     * @param string $fileName
     * @return bool
     * 是否文件名
     */
    public static function isFileName(string $fileName):bool
    {
        return $fileName === self::filterName($fileName);
    }

    /**
     * @param string $funName
     * @return bool
     * 是否存在函数
     */
    public static function isExistsFunction(string $funName):bool
    {
        return function_exists($funName);
    }

    /**
     * @param string $className
     * @param bool $isAUtoLoad
     * @return bool
     * 是否存在类
     */
    public static function isExistsClass(string $className, bool $isAUtoLoad = true):bool
    {
        return class_exists($className, $isAUtoLoad);
    }

    /**
     * @param string $interfaceName
     * @param bool $isAUtoLoad
     * @return bool
     * 是否存在接口
     */
    public static function isExistsInterface(string $interfaceName, bool $isAUtoLoad = true):bool
    {
        return interface_exists($interfaceName, $isAUtoLoad);
    }

    /**
     * @param string $className
     * @param string $methodName
     * @return bool
     * 是否存在类方法
     */
    public static function isExistsMethod(string $className, string $methodName):bool
    {
        return method_exists($className, $methodName);
    }

    /**
     * @param string $className
     * @return bool
     * 是否是类名
     */
    public static function isClassName(string $className):bool
    {
        return strlen($className) <= 128 && preg_match("/^[\\\]?[a-z][a-z\d_\\\]+$/i", $className);
    }

    /**
     * @param string $functionName
     * @return bool
     * 是否是函数名
     */
    public static function isFunctionName(string $functionName):bool
    {
        return strlen($functionName) <= 128 && preg_match("/^[a-z][a-z\d_]+$/i", $functionName);
    }

    /**
     * @param array $arrayData
     * @return bool
     * 是否是列表数组
     */
    public static function isArrayList(array $arrayData):bool
    {
        if(count($arrayData) < 1) return true;
        return !in_array(false, array_map('is_numeric', array_keys($arrayData)), true);
    }

    /**
     * @param array $arrayData
     * @return bool
     * 是否是对象数组
     */
    public static function isArrayObject(array $arrayData):bool
    {
        if(count($arrayData) < 1) return true;
        return in_array(false, array_map('is_numeric', array_keys($arrayData)), true);
    }
}